import java.util.ArrayList;


class ABTreeRootNode extends ABTreeInnerNode 
{

	ABTreeInnerNode rootParent;

	ABTreeRootNode() 
	{
		super(new ABTreeInnerNode(null));
		rootParent = parent;
		parent.children.add(this);
	}

	@Override
	void insert(int value) 
	{

		// Wenn die Anzahl der Kinder in der RootNode zu groß wird, muss der Baum in der Tiefe um eins wachsen.
		if (this.children.size() > b)
		{
			// Alle alten Kinder in ein temp Array schreiben.
			ArrayList<ABTreeNode> temp = new ArrayList<ABTreeNode>();
			temp.addAll(this.children);
			
			// Dann alle Kinder vom RootKnoten enfernen. Und einen neuen Unterknoten erschaffen.
			this.children.removeAll(this.children);
			this.children.add(new ABTreeInnerNode(this));
			
			// Diesem einen Unterknoten, nun drei Kinder hinzufügen.
			for(int i = 0; i < 3; i++)
			{
				temp.get(0).parent = (ABTreeInnerNode) this.children.get(0);
				((ABTreeInnerNode)(this.children.get(0))).children.add(temp.get(0));
				temp.remove(0);
			}
			
			// Dann den zweiten neuen Unterknoten hinzufügen.
			this.children.add(new ABTreeInnerNode(this));
			
			// Dem zweiten Unterknoten die rechslichen drei Kinder hinzufügen.
			for(int i = 0; i < 3; i++)
			{
				temp.get(0).parent = (ABTreeInnerNode) this.children.get(1);
				((ABTreeInnerNode)(this.children.get(1))).children.add(temp.get(0));
				temp.remove(0);
			}
			
			// Die Templiste enfernen.
			temp = null;
			
		}
		else
			super.insert(value);
	}

	@Override
	void remove(int value) 
	{
		// Das Element entfernen. 
		super.remove(value);
		
		// Wenn der RootKnoten nur noch ein Kind hat, muss die Tiefe um eins verringert werden.
		if (this.children.size() < a)
		{
			// Alle Kinder des Kinden der RootNode in ein Array schreiben.
			ArrayList<ABTreeNode> temp = new ArrayList<ABTreeNode>();
			for (int i = 0; i < ((ABTreeInnerNode)this.children.get(0)).children.size(); i++)
			{
				((ABTreeInnerNode)this.children.get(0)).children.get(i).parent = this;
				temp.add(((ABTreeInnerNode)this.children.get(0)).children.get(i));
			}
			// Dann das eine Kinde von der RootNode enfernen.
			this.children.clear();
			// Nur die alten Kinder des Kinden von RootNode nun direkt der RootNode hinzufügen.
			this.children.addAll(temp);
		}
		
		
		this.checkSize();
	}

	@Override
	void checkSize() 
	{
		if (children.size() > b)
			split();
	}
}
